#include "hal_gpio.h"
cx_err_t cx_hal_gpio_set_mode(cx_hal_gpio_handle_t* handle, cx_hal_gpio_mode_t mode)
{
    cx_hal_gpio_pin_t pin = handle->pin;
    uint32_t volatile *p,cfg_value=0;
    if(pin < 8)
    {
        p=&(handle->controller->cfglr);
    }
    else
    {
        p=&(handle->controller->cfghr);
        pin -= 8;
    }
    switch(mode)
    {
        case CX_HAL_GPIO_MODE_INPUT:
            cfg_value = 0;break;
        case CX_HAL_GPIO_MODE_INPUT_PULLUP:
            cfg_value = 0x08;break;
        case CX_HAL_GPIO_MODE_INPUT_PULLDOWN:
            cfg_value = 0x08;break;
        case CX_HAL_GPIO_MODE_OUTPUT_PUSH_PULL:
            cfg_value = 0x03;break;
        case CX_HAL_GPIO_MODE_OUTPUT_OPENDRAIN:
            cfg_value = 0x07;break;
        case CX_HAL_GPIO_MODE_OUTPUT_AF_PUSH_PULL:
            cfg_value = 0x0B;break;
        case CX_HAL_GPIO_MODE_OUTPUT_AF_OPENDRAIN:
            cfg_value = 0x0F;break;
        default:
            break;
    }
    (*p) &= ~(0x0f << pin);
    (*p) |= (cfg_value << pin);
    if(mode == CX_HAL_GPIO_MODE_INPUT_PULLUP)
        handle->controller->odt |= 0x01 << handle->pin;
    else if(mode == CX_HAL_GPIO_MODE_INPUT_PULLDOWN)
        handle->controller->odt &= ~(0x01 << handle->pin);
    return CX_ERR_OK;
}

cx_err_t cx_hal_gpio_write(cx_hal_gpio_handle_t *handle, cx_bit_status_t value)
{
    if(value != CX_RESET)
    {
        handle->controller->odt |= 0x01 << handle->pin;
    }
    else
    {
        handle->controller->odt &= ~(0x01 << handle->pin);
    }

    return CX_ERR_OK;
}

cx_bit_status_t cx_hal_gpio_read(cx_hal_gpio_handle_t *handle)
{
    uint16_t mask = 0x01 << handle->pin;
    cx_bit_status_t ret;
    if((handle->controller->idt & mask) != 0)
    {
        ret = CX_SET;
    }
    else
    {
        ret = CX_RESET;
    }
    return ret;
}
